﻿using System;
using System.Collections.Generic;
using Entidades;
using Ext.Net;
using ModuloSoporte.Excepciones;
using PhantomDb.Entidades;
using Siscont.Contabilidad;
using Siscont.Contabilidad.Excepciones;

namespace IU.Contabilidad.PlanCuentas
{
    /// <summary>
    /// Árbol de cuentas.
    /// </summary>
    public partial class ArbolPlan : System.Web.UI.Page
    {
        private const string NodoAttribute = "Idcuenta";
        private const string NodoString = "{$Idcuenta}. {$Descripcion}";

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                Session["cod-cuenta.old"] = 0;  // Cuenta anteriormente seleccionada
                Session["cod-cuenta"] = null;   // Cuenta seleccionada
                VentanaAM.Hide();               // BUGFIXER

                /* Bugfixer: al hacer varios clicks en aceptar te agrega muchas veces un mov. */
                Session["ArbolGen_CanClick"] = true;

                if(ContabilidadGlobal.Admin.Permisos.AMBloqueado)
                {
                    ButtonAgregar.Hide();
                    ButtonModificar.Hide();
                }
            }

            /* VENTANA DE A/M DE CUENTAS */
            this.CargarDatosEnCombos();
        }

        /// <summary>
        /// Al hacer un click en un nodo.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        [DirectMethod]
        protected void OnClick_Node(object sender, DirectEventArgs e)
        {
            try
            {
                var idCuenta = TreeSelectionModel.SelectedNode.NodeID;

                try
                {
                    /* Si selecciono una cuenta... */
                    if (!idCuenta.Equals("0"))
                    {
                        int oldCod = (int)Session["cod-cuenta.old"];
                        int cod = int.Parse(idCuenta);

                        //  Si la que seleccioné es diferente de la anterior seleccionada
                        if (oldCod != cod)
                        {
                            //  Cargo los datos de la cuenta
                            var cuenta = new Entity_cuenta
                            {
                                Idcuenta = cod.ToString(),
                                Ejercicio_codejercicio = (int)ContabilidadGlobal.Admin.CodEjercicio,
                                Ejercicio_empresa_idempresa = ContabilidadGlobal.Admin.CodEmpresa
                            };

                            cuenta = (Entity_cuenta)CapaDatos.Datos.Manejador[typeof(Entity_cuenta)].Cargar(cuenta);

                            //  Guardo la selección en sesión y muestro los datos

                            Session["cod-cuenta"] = cuenta;

                            TextFieldCod.Text = cod.ToString();
                            TextFieldNom.Text = cuenta.Descripcion;
                            TextFieldNivel.Text = cuenta.Nivel.ToString();
                            TextFieldImputable.Text = cuenta.Imputable ? "Si" : "No";
                            TextFieldColumnaImp.Text = cuenta.Columnaimpresion.ToString();

                            //  Si es imputable muestro campos extra

                            if (cuenta.Imputable)
                            {

                                TextFieldCapitulo.Text = cuenta.Capitulo;
                                TextFieldCapitulo.Show();


                                if (cuenta.Unidad_idunidad > 0)
                                {
                                    Entity_unidad unidad = new Entity_unidad
                                    {
                                        Empresa_idempresa = ContabilidadGlobal.Admin.CodEmpresa,
                                        Idunidad = cuenta.Unidad_idunidad
                                    };

                                    unidad = (Entity_unidad)CapaDatos.Datos.Manejador[typeof(Entity_unidad)].Cargar(unidad);

                                    TextFieldUnidad.Text = string.Format("{0} - {1}", unidad.Idunidad, unidad.Descripcion);
                                    TextFieldUnidad.Show();
                                }
                                else
                                {
                                    TextFieldUnidad.Hide();
                                }
                            }
                            else // Si no es imputable, oculto algunos campos
                            {
                                TextFieldUnidad.Hide();
                                TextFieldCapitulo.Hide();
                            }

                            //  Muestro datos de la cuenta

                            if (FormPanelDetalles.Hidden)
                                FormPanelDetalles.Show();

                            //  Botón de edición

                            if (ContabilidadGlobal.Admin.Permisos.AMBloqueado)
                            {
                                if (cuenta.Editable)
                                    ButtonModificar.Show();
                                else
                                    ButtonModificar.Hide();
                            }

                            //  Guardo en sesión

                            Session["cod-cuenta.old"] = cod;
                        }
                    }
                    else
                    {
                        FormPanelDetalles.Hide();
                        ButtonModificar.Hide();
                        Session["cod-cuenta.old"] = 0;
                        Session["cod-cuenta"] = null;
                    }
                }
                catch
                {
                    Session["cod-cuenta.old"] = 0;
                    Session["cod-cuenta"] = null;
                    ButtonModificar.Hide();
                }
            }
            catch { }
        }

        [DirectMethod]
        protected void ButtonAgregar_Click(object sender, DirectEventArgs e)
        {
            this.FormNumberFieldCod.ReadOnly = false;
            this.FormNumberFieldColumn.Value = 4;

            Session["ArbolGen_CanClick"] = true; /* Bugfix */
            Session["ArbolGen_Modificar"] = false;
            VentanaAM.Show();
            CargarDatosEnCombos();
        }

        [DirectMethod]
        protected void ButtonModificar_Click(object sender, DirectEventArgs e)
        {
            // Modificar cuenta
            var cuenta = (Entity_cuenta)Session["cod-cuenta"];
            if (cuenta != null)
            {
                this.FormNumberFieldCod.Value = int.Parse(cuenta.Idcuenta);
                this.FormTextFieldCapi.Text = cuenta.Capitulo;
                this.FormTextFieldDescripcion.Text = cuenta.Descripcion;
                this.FormNumberFieldColumn.Value = cuenta.Columnaimpresion;
                this.FTextFieldImputable.Text = cuenta.Imputable ? "Si" : "No";

                this.FormNumberFieldCod.ReadOnly = true;

                Session["ArbolGen_CanClick"] = true; /* Bugfix */
                Session["ArbolGen_Modificar"] = true;
                VentanaAM.Show();
                CargarDatosEnCombos();
            }
        }

        [DirectMethod]
        protected void ButtonUpdate_Click(object sender, DirectEventArgs e)
        {
            // Actualizar árbol
        }

        /// <summary>
        /// Carga los datos del combo de unidades.
        /// </summary>
        protected void CargarDatosEnCombos()
        {
            try
            {
                StoreComboMov.DataSource = ContabilidadGlobal.Admin.ObtenerListaUnidades();
                StoreComboMov.DataBind();
            }
            catch (Exception ex)
            {
                UIHelper.MostrarExcepcionSimple(ex, "Error al cargar las unidades");
            }
        }

        /// <summary>
        /// Aceptar alta/modificación.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        [DirectMethod]
        protected void Form_BotonAceptar_Click(object sender, DirectEventArgs e)
        {
            try
            {
                if ((bool)Session["ArbolGen_CanClick"])
                {
                    /* Obtener datos de la ventana y asignarlos a una entidad de cuenta */
                    var dict = JSON.Deserialize<Dictionary<string, string>>(e.ExtraParams["values"]);
                    var cuenta = new Entidades.Entity_cuenta
                    {
                        Idcuenta = dict["FormNumberFieldCod"],
                        Columnaimpresion = int.Parse(dict["FormNumberFieldColumn"]),
                        Descripcion = dict["FormTextFieldDescripcion"],
                        Ejercicio_codejercicio = (int)ContabilidadGlobal.Admin.CodEjercicio,
                        Ejercicio_empresa_idempresa = ContabilidadGlobal.Admin.CodEmpresa,
                        Imputable = !dict["FTextFieldImputable"].Equals("no", StringComparison.OrdinalIgnoreCase),
                        Capitulo = dict["FormTextFieldCapi"],
                        Editable = true,
                        Unidad_idunidad = 0, // NINGUNA UNIDAD
                        Nivel = (short)Cuenta.CalcularNivel(dict["FormNumberFieldCod"])
                    };

                    /* Validar datos */
                    Cuenta cuentaValidadora = new Cuenta(cuenta);
                    
                    /* Actualizar base de datos */
                    var db = CapaDatos.Datos.Manejador[typeof(Entity_cuenta)];

                    /* Work */
                    if (!(bool)Session["ArbolGen_Modificar"]) // ALTA
                    {
                        cuentaValidadora.ValidarDatosAlta();

                        db.Insertar(cuenta);
                    }
                    else // MODIFICACIÓN
                    {
                        cuentaValidadora.ValidarDatosEdicion();

                        CustomValue[] valores = new CustomValue[] 
                        {
                            new CustomValue("Columnaimpresion", cuenta.Columnaimpresion),
                            new CustomValue("Descripcion", cuenta.Descripcion),
                            new CustomValue("Unidad_idunidad", cuenta.Unidad_idunidad),
                            new CustomValue("Capitulo", cuenta.Capitulo)
                        };

                        db.Modificar(cuenta, valores);
                        Session["cod-cuenta"] = cuenta;
                    }
                }

                this.CerrarVentana();
                Session["ArbolGen_CanClick"] = false; /* Bugfix */
            }
            catch (ExcepcionValorInvalido ex)
            {
                UIHelper.MostrarExcepcionSimple(ex, "Valor inválido");
            }
            catch (Excepcion ex)
            {
                UIHelper.MostrarExcepcionSimple(ex, ex.Titulo);
            }
            catch (Exception ex)
            {
                UIHelper.MostrarExcepcionSimple(ex, "Error");
                this.CerrarVentana();
                Session["ArbolGen_CanClick"] = false; /* Bugfix */
            }
        }

        [DirectMethod]
        protected void Form_BotonCancelar_Click(object sender, DirectEventArgs e)
        {
            // this.CerrarVentana(); // Ahora ejecuto el cierre por client-side
        }

        /// <summary>
        /// Oculta la ventana y resetea todos sus campos.
        /// </summary>
        private void CerrarVentana()
        {
            VentanaAM.Hide();
        }
    }
}
